/*->c.ftp */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>

#include "h.os"
#include "h.wimp"



#include "h.wos"
#include "h.main"
#include "h.ram"
#include "h.mym"
#include "h.trans"


#include "h.serial"

#include "h.xmodem"

#include "h.vxmenu"
#include "h.vxcet"

#include "h.batch"
#include "h.xext"

#include "h.ftp"


/*****************************************************************************/

/*
char * ftpname[9]= {
                    "Xmodem",
                    "Xmodem 1K",
                    "Ymodem",
                    "Zmodem",
                    "Kermit",
                    "SEAlink",
                    "ASCII",
                    "CET",
                    "None"
                   }; */


char * ftpname[9]= {
                    "FTL0",
                    "FTL1",
                    "FTL2",
                    "FTL3",
                    "FTL4",
                    "FTL5",
                    "FTL6",
                    "FTL7",
                    "FTL8"
                   };




/* char * ftpshortname[9]=
                       {
                        "Xmodem",
                        "Xmdm 1K",
                        "Ymodem",
                        "Zmodem",
                        "Kermit",
                        "SEAlink",
                        "ASCII",
                        "CET",
                        "None"
                       }; */


 char * ftpshortname[9]=
                       {
                        "FTS0",
                        "FTS1",
                        "FTS2",
                        "FTS3",
                        "FTS4",
                        "FTS5",
                        "FTS6",
                        "FTS7",
                        "FTS8"
                       };








/* char * ftpstatus[6]=
                    {
                     "",
                     "Sent",
                     "Short",
                     "Ready",
                     "Open",
                     "Recvd"
                    }; */

 char * ftpstatus[6]=
                    {
                     "FTP0",
                     "FTP1",
                     "FTP2",
                     "FTP3",
                     "FTP4",
                     "FTP5"
                    };




int ftp_ok;                /* flag used for cancel icon on ftp window     */
int ftprotocol;            /* number of current protocol                  */
int ftpactive=0;           /* global flag that says if an ftp is going on */
int ftp_cont;              /* flag used for continue icon                 */
int ftpline;               /* online when ftp started ?                   */
int ftpsaveflow;           /* was Xon/Xoff on when ftp started ?          */


/*****************************************************************************/
/* ftp serial io */


/* are we on line ? */

int ftponline(void)
{
 if(ftpline) return(online);
 else        return(1);
}


/* trash the input buffer */

void ftpflushinput(void)
{
 int r0=1; /* RX    */
 int r1=0; /* purge */
 xexec2("modem_countpurge",&r0,&r1,NULL);
}



/* returns number of bytes in the input buffer */

int ftpinputchars(void)
{
 int r0=1; /* RX              */
 int r1=1; /* bytes in buffer */
 if(!xexec2("modem_countpurge",&r0,&r1,&r1)) r1=0;
 return(r1);
}


/* returns number of bytes in the output buffer */

int ftpoutputchars(void)
{
 int r0=0; /* TX              */
 int r1=1; /* bytes in buffer */
 if(!xexec2("modem_countpurge",&r0,&r1,&r1)) r1=0;
 else
 if(r1<0) r1=0;

 return(r1);
}



/* trash the output buffer */

void ftpflushoutput(void)
{
 int r0=0; /* TX    */
 int r1=0; /* purge */
 xexec2("modem_countpurge",&r0,&r1,NULL);
}



/* have we been Xoffed by the other end ? */

int ftpflow(void)
{
 int r0;

 if(xexec("modem_readflow",NULL,NULL,&r0))
 {
  r0=(r0 >> 16) & 0x1;
 }
 else
  r0=0;

 return(r0);
}



/* get a byte from line, in given time, or return -1 */

int ftpgetbyte(int time)
{
 int byte;

 time=clock()+time;

 do 
 {
  if((byte=getbyte())!=-1) return(byte);
  pollzt();
  if(!ftp_ok) return(-1);
 } while(time>clock());

 return(-1);
}




/* send cancel string to get the other end to shut up */

void ftpcanit(void)
{
 static char canitstr[]=
 {
  24,24,24,24,24,24,24,24,24,24,8,8,8,8,8,8,8,8,8,8,0
 };
 int i=0;

 while(canitstr[i]) outbyte(canitstr[i++]);
}



int ftpoutbyte(int byte)
{
 static int pcount;
   /*     int time; */

 if(pcount>(txbyterate/2))
 {
  pcount=ftpoutputchars();

  while(pcount>(txbyterate/4))
  {                    /* now work out how long before need poll to return */
/*   if(txbyterate>1) time=clock()+(pcount*100)/(txbyterate*8);
   else             time=0;

   do pollzt(); while(time>clock());  */

   pollzt();
   pcount=ftpoutputchars();
  }
 }

 pcount++;
 return(outbyte(byte));
}


/****************************************************************************/

int tranboxopen;


void opentranbox(char * what)
{
 char string[64];
 int  handle;

 ftp_ok=-1;

 sprintf(string,"%s %s",transtoken(ftpname[ftprotocol]),transtoken(what));

 handle=createwindowsub(TRANBOX,string);

 ftpopenbox(string);

 popup(handle,0);

 tranboxopen=1;
}




void closetranbox(void)
{
 while(1)
 {
  getpointer();
  if(mhandle==whandle[TRANBOX] && buttons) poll(0);
  else break;
 }

 closedownt(TRANBOX);
 tranboxopen=0;
}



void ftpsetflow(int ftp)
{
 if(ftp==PXMODEM || ftp==PYMODEM || ftp==PYMODEMB || ftp==PSEALINK)
 {
  ftpsaveflow=flow;
  if(ftpsaveflow==2) setflow(0);
 }
}



void ftpresetflow(int ftp)
{
 if(ftp==PXMODEM || ftp==PYMODEM || ftp==PYMODEMB || ftp==PSEALINK)
 {
  if(ftpsaveflow==2) setflow(2);
 }
}



void ftpsend(void)
{
 int dir=0;

 if(ftpactive) return;

 ftpline=online;
 ftpsetflow(ftprotocol);
 ftpactive=1;

 opentranbox("FTP6"); /* send */

 xexec2("sys_ftp_start",&dir,&ftprotocol,NULL);
 
 switch(ftprotocol)
 {
  case   PASCII:
                asciitx();
                break;

  case  PXMODEM:
                xmodemtx();
                break;

  case  PYMODEM:
                ymodemtx();
                break;

  case PYMODEMB:
                ymodembtx();
                break;

  case PSEALINK:
                clinktx();
                break;

  case  PZMODEM:
                zmodemtx();
                break;

  case  PKERMIT:
                kermittx();
                break;

 }

 xexec2("sys_ftp_end",&dir,&ftprotocol,NULL);

 closetranbox();

 ftpresetflow(ftprotocol);
 ftpactive=0;
 ftpwarning();
}




void ftpdoautosend(void)
{
 remzeroevent(FTPASEND);
 ftpsend();
}


void ftpreceive(void)
{
 int dir=1;

 if(ftpactive) return;

 ftpline=online;
 ftpsetflow(ftprotocol);
 ftpactive=1;

 opentranbox("FTP7"); /* receive */

 xexec2("sys_ftp_start",&dir,&ftprotocol,NULL);


 switch(ftprotocol)
 {

  case   PASCII:
                asciirx();
                break;

  case     PCET:
                tsdlx();
                break;

  case  PXMODEM:
                xmodemrx();
                break;

  case  PYMODEM:
                ymodemrx();
                break;

  case PYMODEMB:
                ymodembrx();
                break;

  case PSEALINK:
                clinkrx();
                break;

  case  PZMODEM:
                zmodemrx();
                break;

  case  PKERMIT:
                kermitrx();
                break;
 }


 xexec2("sys_ftp_end",&dir,&ftprotocol,NULL);

 closetranbox();

 ftpresetflow(ftprotocol);
 ftpactive=0;
 ftpwarning();
}


/* receive using given protocol */

void ftpreceivep(int protocol)
{
 int temp=ftprotocol;
 ftprotocol=protocol;
 ftpreceive();
 ftprotocol=temp;
}


void ftpsendp(int protocol)
{
 int temp=ftprotocol;
 ftprotocol=protocol;
 ftpsend();
 ftprotocol=temp;
}



void kermitget(char * getcmd)
{
 int dir=1;

 if(ftpactive) return;

 ftpline=online;
 ftpactive=1;

 opentranbox("FTP8");   /* get */

 xexec2("sys_ftp_start",&dir,&ftprotocol,NULL);

 kermitdoget(getcmd);

 xexec2("sys_ftp_end",&dir,&ftprotocol,NULL);

 closetranbox();

 ftpactive=0;
 ftpwarning();
}




void kermitserver(void)
{
 int dir=-1;

 if(ftpactive) return;

 ftpline=online;
 ftpactive=1;

 opentranbox("FTP9");  /* server */

 xexec2("sys_ftp_start",&dir,&ftprotocol,NULL);

 kermitdoserver();

 xexec2("sys_ftp_end",&dir,&ftprotocol,NULL);

 closetranbox();

 ftpactive=0;
}



/****************************************************************************/
/* script interface */


void sendfiles(int fp)
{
 fp=0;
 ftpsend();
}


void receivefiles(int fp)
{
 fp=0;
 ftpreceive();
}


void skermitget(int fp)
{
 char string[256];
 strcpy(string,stringptr(stack[fp]));
 kermitget(string);
}


void skermitserver(int fp)
{
 kermitserver();
 fp=0;
}



/***************************************************************************/
/*
 Code to handle FTP menus
*/
/***************************************************************************/




void setpopftp(void)
{
 int i;
 for(i=0;i<8;i++) tickst(ftp_menu,i,i==ftprotocol);

 setpopkermit();
}



void decodeftp(int m1,int m2,int m3,int m4)
{
 if(m1>=PXMODEM && m1<PNONE) ftprotocol=m1;

 switch(m1)
 {
  case     PCET:
  case   PASCII:                         /* selecting protocol */
  case PSEALINK:
  case  PXMODEM:
  case  PYMODEM:
  case PYMODEMB:
  case  PZMODEM:
                break;

  case  PKERMIT:
                decodekermit(m2,m3,m4);
                break;

         case 8:
                opentxbatch();
                break;

         case 9:
                openrxbatch();
                break;

        case 11:
                ftpreceive();
                break;

        case 12:
                ftpsend();
                break;
 }

}

